#ifndef __WED_NETDEV_H__
#define __WED_NETDEV_H__

#include "dev/Wed_dev.h"
#include "mem/Wed_mem.h"
#include "print/Wed_print.h"

#ifndef WED_NETDEV_HWADDR_MAX_LEN
#define WED_NETDEV_HWADDR_MAX_LEN          8U
#endif

/* \brief 网络设备操作函数集结构体 */
struct Wed_netdev_opts {
    int (*p_fn_init)(void *p_opts_arg);
    int (*p_fn_raw_output)(void *p_opts_arg, uint8_t *p_buf, uint16_t buf_len);
};

/* \brief 网络设备结构体 */
struct Wed_netdev {
    struct Wed_dev          dev;                                /* 基础设备 */
    struct Wed_list_node    node;                               /* 网络设备节点 */
    struct Wed_netdev_opts *p_opts;                             /* 操作函数集 */
    void                   *p_opts_arg;                         /* 操作函数参数 */
    struct Wed_mutex        lock;                               /* 互斥锁 */
    uint8_t                 hwaddr[WED_NETDEV_HWADDR_MAX_LEN];  /* 硬件地址 */
    uint8_t                 hwaddr_len;                         /* 硬件地址长度 */
    char                   *p_phy_name[WED_DEV_NAME_LEN];       /* PHY 设备名字 */
    uint16_t                flags;                              /* 网络设备状态标志 */
    uint16_t                mtu;                                /* 最大传输单元（字节） */
};

//    rt_slist_t list;
//
//    char name[RT_NAME_MAX];                            /* network interface device name */
//    ip_addr_t ip_addr;                                 /* IP address */
//    ip_addr_t netmask;                                 /* subnet mask */
//    ip_addr_t gw;                                      /* gateway */
//#if NETDEV_IPV6
//    ip_addr_t ip6_addr[NETDEV_IPV6_NUM_ADDRESSES];     /* array of IPv6 addresses */
//#endif /* NETDEV_IPV6 */
//    ip_addr_t dns_servers[NETDEV_DNS_SERVERS_NUM];     /* DNS server */
//    uint8_t hwaddr_len;                                /* hardware address length */
//    uint8_t hwaddr[NETDEV_HWADDR_MAX_LEN];             /* hardware address */
//
//    uint16_t flags;                                    /* network interface device status flag */
//    uint16_t mtu;                                      /* maximum transfer unit (in bytes) */
//    const struct netdev_ops *ops;                      /* network interface device operations */
//
//    netdev_callback_fn status_callback;                /* network interface device flags change callback */
//    netdev_callback_fn addr_callback;                  /* network interface device address information change callback */
//
//#ifdef RT_USING_SAL
//    void *sal_user_data;                               /* user-specific data for SAL */
//#endif /* RT_USING_SAL */
//    void *user_data;                                   /* user-specific data */

/**
 * \brief 网络设备链表初始化
 *
 * @return 成功返回 0
 */
int Wed_netdev_list_init(void);
/**
 * \brief 网络设备注册函数
 *
 * @param p_net_name 网络设备名字
 * @param p_opts     网络设备操作函数集
 * @param p_opts_arg 操作函数参数
 *
 * @return 成功返回 0
 */
int Wed_netdev_register(char                   *p_net_name,
                        struct Wed_netdev_opts *p_opts,
                        void                   *p_opts_arg);
/**
 * \brief 初始化所有网络设备
 *
 * @return 成功返回 0
 */
int Wed_netdev_init_all(void);
/**
 * \brief 根据名字获取网络设备结构体
 *
 * @param p_net_name 网络设备名字
 *
 * @return 找到返回网络设备结构体，没找到返回 NULL
 */
struct Wed_netdev *Wed_netdev_find_by_name(char *p_net_name);
/**
 * \brief 网络设备原始输出函数
 *
 * @param p_netdev 相关网络设备结构体
 * @param p_data   要写的数据缓存
 * @param data_len 要写的数据长度
 *
 * @return 成功返回 0
 */
int Wed_netdev_raw_output(struct Wed_netdev *p_netdev,
                          uint8_t           *p_data,
                          uint16_t           data_len);
#endif
